//============================================================================================
/**
 * @file	ld_houou.c
 * @brief	伝説デモ画面・ホウオウ処理
 * @author	Hiroyuki Nakamura
 * @date	09.01.21
 */
//============================================================================================
#include "common.h"

#include "system/wipe.h"
#include "system/arc_util.h"
#include "system/snd_tool.h"

#include "../../../src/field/fieldsys.h"

#include "ld_main.h"
#include "ld_houou.h"
#include "ld_houou_snd_def.h"
#include "ld_houou.naix"


//============================================================================================
//	定数定義
//============================================================================================

// メインシーケンス
enum {
	MAINSEQ_INIT = 0,		// 初期化
	MAINSEQ_RELEASE,		// 解放
	MAINSEQ_FADE,			// フェード

	MAINSEQ_1ST_SCENE_MAIN,	// 第１シーンメイン
	MAINSEQ_2ND_SCENE_CHG,	// 第２シーンへ切り替え
	MAINSEQ_2ND_SCENE_MAIN,	// 第２シーンメイン

#ifdef	PM_DEBUG
	MAINSEQ_DEBUG_MAIN,		// デバッグ用メイン
#endif	// PM_DEBUG

	MAINSEQ_END,			// 終了
};

// シーンデータ定義
enum {
	// 一番目のシーン
	HOUOU_SCENE_02_1 = 0,
	HOUOU_SCENE_02_MAX,

	// 二番目のシーン
	HOUOU_SCENE_03_1 = 0,
	HOUOU_SCENE_03_MAX,
};


//============================================================================================
//	プロトタイプ宣言
//============================================================================================
static int MainSeq_Init( LEGEND_DEMO_WORK * wk );
static int MainSeq_Release( LEGEND_DEMO_WORK * wk );
static int MainSeq_Fade( LEGEND_DEMO_WORK * wk );
static int MainSeq_1stSceneMain( LEGEND_DEMO_WORK * wk );
static int MainSeq_2ndSceneChg( LEGEND_DEMO_WORK * wk );
static int MainSeq_2ndSceneMain( LEGEND_DEMO_WORK * wk );

#ifdef	PM_DEBUG
static int MainSeq_DebugMain( LEGEND_DEMO_WORK * wk );
#endif	// PM_DEBUG


//============================================================================================
//	グローバル変数
//============================================================================================

// メインシーケンス
static const pLegendDemoFunc MainSeq[] = {
	MainSeq_Init,
	MainSeq_Release,
	MainSeq_Fade,

	MainSeq_1stSceneMain,
	MainSeq_2ndSceneChg,
	MainSeq_2ndSceneMain,

#ifdef	PM_DEBUG
	MainSeq_DebugMain,
#endif	// PM_DEBUG
};

// 一番目のシーンのリソースデータ
static const LD_RES_TBL Houou02ResTbl[] =
{
	{	// 朝
		NARC_ld_houou_ho_s02_1_a_lz_nsbmd,
		{
			NARC_ld_houou_ho_s02_1_a_lz_nsbca, NARC_ld_houou_ho_s02_1_a_lz_nsbma,
			NARC_ld_houou_ho_s02_1_a_lz_nsbta, NARC_ld_houou_ho_s02_1_a_lz_nsbtp
		},
		FALSE
	},
	{	// 昼
		NARC_ld_houou_ho_s02_1_b_lz_nsbmd,
		{
			NARC_ld_houou_ho_s02_1_b_lz_nsbca, NARC_ld_houou_ho_s02_1_b_lz_nsbma,
			NARC_ld_houou_ho_s02_1_b_lz_nsbta, NARC_ld_houou_ho_s02_1_b_lz_nsbtp
		},
		FALSE
	},
	{	// 夜
		NARC_ld_houou_ho_s02_1_c_lz_nsbmd,
		{
			NARC_ld_houou_ho_s02_1_c_lz_nsbca, NARC_ld_houou_ho_s02_1_c_lz_nsbma,
			NARC_ld_houou_ho_s02_1_c_lz_nsbta, NARC_ld_houou_ho_s02_1_c_lz_nsbtp
		},
		FALSE
	}
};

// 二番目のシーンのリソースデータ
static const LD_RES_TBL Houou03ResTbl[] =
{
	{	// 朝
		NARC_ld_houou_ho_s03_0_a_lz_nsbmd,
		{
			NARC_ld_houou_ho_s03_0_a_lz_nsbca, NARC_ld_houou_ho_s03_0_a_lz_nsbma,
			NARC_ld_houou_ho_s03_0_a_lz_nsbta, LD_RES_DUMMY
		},
		FALSE
	},
	{	// 昼
		NARC_ld_houou_ho_s03_0_b_lz_nsbmd,
		{
			NARC_ld_houou_ho_s03_0_b_lz_nsbca, NARC_ld_houou_ho_s03_0_b_lz_nsbma,
			NARC_ld_houou_ho_s03_0_b_lz_nsbta, LD_RES_DUMMY
		},
		FALSE
	},
	{	// 夜
		NARC_ld_houou_ho_s03_0_c_lz_nsbmd,
		{
			NARC_ld_houou_ho_s03_0_c_lz_nsbca, NARC_ld_houou_ho_s03_0_c_lz_nsbma,
			NARC_ld_houou_ho_s03_0_c_lz_nsbta, LD_RES_DUMMY
		},
		FALSE
	}
};

// 一番目のシーンのカメラ設定
static const LD_CAMERA_DATA CameraData02 =
{
/*
	{
		0x4b4152,						// 距離
		{ 0xb60, 0xdaa0, 0x0 },			// アングル
		GF_CAMERA_PERSPECTIV,			// 射影
		0x841,							// パース
		0,								// dummy
	},
	{ 0x244d1a, 0x222c36, 0xffd9c940 },	// 注視点
	150 * FX32_ONE,						// near
	1700 * FX32_ONE						// far
*/
	{
		0x4b4152,						// 距離
		{ 0xc80, 0xd8e0, 0x0 },			// アングル
		GF_CAMERA_PERSPECTIV,			// 射影
		0x881,							// パース
		0,								// dummy
	},
	{ 0x25a7f4, 0x24282f, 0xffda317d },	// 注視点
	9 * FX32_ONE,						// near
	1700 * FX32_ONE						// far
};

// 二番目のシーンのカメラ設定
static const LD_CAMERA_DATA CameraData03 =
{
	{
		0x1ba152,							// 距離
		{ 0xeca2, 0x8380, 0x0 },				// アングル
		GF_CAMERA_PERSPECTIV,				// 射影
		0x381,								// パース
		0,									// dummy
	},
	{ 0xfffed809, 0xfffdf1fc, 0x3af93 },	// 注視点
	150 * FX32_ONE,							// near
	1700 * FX32_ONE							// far
};

// エッジマーキングカラー
static const GXRgb EdgeColor[8] = {
    GX_RGB(0,0,0),
    GX_RGB(4,4,4),
    GX_RGB(4,4,4),
    GX_RGB(4,4,4),
    GX_RGB(4,4,4),
    GX_RGB(4,4,4),
    GX_RGB(4,4,4),
    GX_RGB(4,4,4)
};


//--------------------------------------------------------------------------------------------
/**
 * ホウオウデモ：メイン処理
 *
 * @param	wk		伝説デモワーク
 *
 * @retval	"1 = 処理中"
 * @retval	"0 = それ以外"
 */
//--------------------------------------------------------------------------------------------
int LDHOUOU_Main( LEGEND_DEMO_WORK * wk )
{
	wk->main_seq = MainSeq[wk->main_seq]( wk );

	if( wk->main_seq == MAINSEQ_END ){
		return 0;
	}

	LDMAIN_Draw3DMain( wk );

	return 1;
}


//============================================================================================
//	メインシーケンス
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * メインシーケンス：初期化
 *
 * @param	wk		伝説デモワーク
 *
 * @return	次のシーケンス
 */
//--------------------------------------------------------------------------------------------
static int MainSeq_Init( LEGEND_DEMO_WORK * wk )
{
	LDMAIN_CommInit( wk );
	LDMAIN_SetLight( &wk->dat->glst );
	LDMAIN_EdgeMarkingSet( EdgeColor );

#ifdef	PM_DEBUG
	if( wk->dat->debug == 1 ){
		if( wk->dat->scene == 0 ){
			LDMAIN_InitCamera( wk, &CameraData02 );
			LDMAIN_Load3DData( wk, ARC_LD_HOUOU, &Houou02ResTbl[wk->dat->time], HOUOU_SCENE_02_MAX );
		}else{
			LDMAIN_InitCamera( wk, &CameraData03 );
			LDMAIN_Load3DData( wk, ARC_LD_HOUOU, &Houou03ResTbl[wk->dat->time], HOUOU_SCENE_03_MAX );
		}
		LDMAIN_FadeInSet( wk, WIPE_DEF_DIV, WIPE_DEF_SYNC, MAINSEQ_DEBUG_MAIN );
	}else{
		LDMAIN_InitCamera( wk, &CameraData02 );
		LDMAIN_Load3DData( wk, ARC_LD_HOUOU, &Houou02ResTbl[wk->dat->time], HOUOU_SCENE_02_MAX );
		LDMAIN_WhiteInSet( wk, WIPE_DEF_DIV, WIPE_DEF_SYNC, MAINSEQ_1ST_SCENE_MAIN );
	}
#else
	LDMAIN_InitCamera( wk, &CameraData02 );
	LDMAIN_Load3DData( wk, ARC_LD_HOUOU, &Houou02ResTbl[wk->dat->time], HOUOU_SCENE_02_MAX );
	LDMAIN_WhiteInSet( wk, WIPE_DEF_DIV, WIPE_DEF_SYNC, MAINSEQ_1ST_SCENE_MAIN );
#endif	// PM_DEBUG

	return MAINSEQ_FADE;
}

//--------------------------------------------------------------------------------------------
/**
 * メインシーケンス：解放
 *
 * @param	wk		伝説デモワーク
 *
 * @return	次のシーケンス
 */
//--------------------------------------------------------------------------------------------
static int MainSeq_Release( LEGEND_DEMO_WORK * wk )
{
	LDMAIN_Delete3DData( wk );

	LDMAIN_CommRelease( wk );

	return MAINSEQ_END;
}

//--------------------------------------------------------------------------------------------
/**
 * メインシーケンス：フェード
 *
 * @param	wk		伝説デモワーク
 *
 * @return	次のシーケンス
 */
//--------------------------------------------------------------------------------------------
static int MainSeq_Fade( LEGEND_DEMO_WORK * wk )
{
	if( WIPE_SYS_EndCheck() == TRUE ){
		return wk->next_seq;
	}
	return MAINSEQ_FADE;
}


// シーン１のデータ
#define	S1_FADE_OUT_DIV		( WIPE_DEF_DIV )		// フェード分割数
#define	S1_FADE_OUT_SYNC	( WIPE_DEF_SYNC )		// フェードフレーム数

#define	S1_DEMO_CNT_MAX			( 135 )				// シーン１の総フレーム数
#define	S1_DEMO_CNT_SE_PLAY01	( 0 )				// ＳＥ１再生フレーム
#define	S1_DEMO_CNT_SE_PLAY02	( 40 )				// ＳＥ２再生フレーム
#define	S1_DEMO_CNT_SE_PLAY03	( 78 )				// ＳＥ３再生フレーム
#define	S1_DEMO_CNT_SE_PLAY04	( 98 )				// ＳＥ４再生フレーム
#define	S1_DEMO_CNT_FADE_OUT	( S1_DEMO_CNT_MAX - S1_FADE_OUT_DIV * S1_FADE_OUT_SYNC )	// フェードアウト開始フレーム

#ifdef PM_DEBUG
static u32	testCnt = 0;
#endif

//--------------------------------------------------------------------------------------------
/**
 * メインシーケンス：一番目のシーンのメイン処理
 *
 * @param	wk		伝説デモワーク
 *
 * @return	次のシーケンス
 */
//--------------------------------------------------------------------------------------------
static int MainSeq_1stSceneMain( LEGEND_DEMO_WORK * wk )
{
	if( LDMAIN_AllObjAnmCheck( wk ) == FALSE &&
		WIPE_SYS_EndCheck() == TRUE ){
//		OS_Printf( "cnt = %d\n", wk->cnt );
		wk->cnt = 0;
//		LDMAIN_FadeOutSet( wk, WIPE_DEF_DIV, WIPE_DEF_SYNC, MAINSEQ_2ND_SCENE_CHG );
//		return MAINSEQ_FADE;
		return MAINSEQ_2ND_SCENE_CHG;
	}

#ifdef PM_DEBUG
	if( sys.trg & PAD_BUTTON_A ){
		OS_Printf( "testCnt[%d] = %d\n", testCnt, wk->cnt );
		testCnt++;
	}
#endif

	if( wk->cnt == S1_DEMO_CNT_SE_PLAY01 ){
		Snd_SePlay( SE_LD_HOUOU_SUZU );
	}else if( wk->cnt == S1_DEMO_CNT_SE_PLAY02 ){
		Snd_SePlay( SE_LD_HOUOU_LIGHT );
	}else if( wk->cnt == S1_DEMO_CNT_SE_PLAY03 ){
		Snd_PlayerFieldDemoBgmPlay( SEQ_GS_E_HOUOU );
		Snd_SePlay( SE_LD_HOUOU_RING );
	}else if( wk->cnt == S1_DEMO_CNT_SE_PLAY04 ){
		Snd_SePlay( SE_LD_HOUOU_RING2 );
	}else if( wk->cnt == S1_DEMO_CNT_FADE_OUT ){
		LDMAIN_FadeOutSet( wk, S1_FADE_OUT_DIV, S1_FADE_OUT_SYNC, MAINSEQ_1ST_SCENE_MAIN );
	}

	wk->cnt++;

	return MAINSEQ_1ST_SCENE_MAIN;
}

//--------------------------------------------------------------------------------------------
/**
 * メインシーケンス：二番目のシーンへ切り替え
 *
 * @param	wk		伝説デモワーク
 *
 * @return	次のシーケンス
 */
//--------------------------------------------------------------------------------------------
static int MainSeq_2ndSceneChg( LEGEND_DEMO_WORK * wk )
{
	LDMAIN_Delete3DData( wk );

	LDMAIN_InitCamera( wk, &CameraData03 );
	LDMAIN_Load3DData( wk, ARC_LD_HOUOU, &Houou03ResTbl[wk->dat->time], HOUOU_SCENE_03_MAX );
	LDMAIN_FadeInSet( wk, WIPE_DEF_DIV, WIPE_DEF_SYNC, MAINSEQ_2ND_SCENE_MAIN );

	return MAINSEQ_FADE;
}


// シーン２のデータ
#define	S2_FADE_OUT_DIV		( 10 )				// フェード分割数
#define	S2_FADE_OUT_SYNC	( WIPE_DEF_SYNC )	// フェードフレーム数

#define	S2_DEMO_CNT_MAX			( 200 )			// シーン２の総フレーム数
#define	S2_DEMO_CNT_FADE_OUT	( S2_DEMO_CNT_MAX - S2_FADE_OUT_DIV * S2_FADE_OUT_SYNC )	// フェードアウト開始フレーム

//--------------------------------------------------------------------------------------------
/**
 * メインシーケンス：二番目のシーンのメイン処理
 *
 * @param	wk		伝説デモワーク
 *
 * @return	次のシーケンス
 */
//--------------------------------------------------------------------------------------------
static int MainSeq_2ndSceneMain( LEGEND_DEMO_WORK * wk )
{
	if( LDMAIN_AllObjAnmCheck( wk ) == FALSE &&
		WIPE_SYS_EndCheck() == TRUE ){
//		OS_Printf( "cnt = %d\n", wk->cnt );
		wk->cnt = 0;
//		LDMAIN_FadeOutSet( wk, WIPE_DEF_DIV, WIPE_DEF_SYNC, MAINSEQ_RELEASE );
//		return MAINSEQ_FADE;
		return MAINSEQ_RELEASE;
	}

	if( ( wk->cnt & 0x3f ) == 0 ){
		Snd_SePlay( SE_LD_HOUOU_FLY );
	}

	if( wk->cnt == S2_DEMO_CNT_FADE_OUT ){
		LDMAIN_WhiteOutSet( wk, S2_FADE_OUT_DIV, S2_FADE_OUT_SYNC, MAINSEQ_RELEASE );
	}

	wk->cnt++;

	return MAINSEQ_2ND_SCENE_MAIN;
}





//============================================================================================
//============================================================================================
//============================================================================================
//============================================================================================
//============================================================================================
//============================================================================================
//============================================================================================
//============================================================================================
//============================================================================================
//	デバッグ処理
//============================================================================================
#ifdef	PM_DEBUG
// メインシーケンス：デバッグメイン
static int MainSeq_DebugMain( LEGEND_DEMO_WORK * wk )
{
	if( LDMAIN_DebugMainControl( wk ) == FALSE ){
		LDMAIN_FadeOutSet( wk, WIPE_DEF_DIV, WIPE_DEF_SYNC, MAINSEQ_RELEASE );
		return MAINSEQ_FADE;
	}

	return MAINSEQ_DEBUG_MAIN;
}
#endif	// PM_DEBUG